/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.ipartek.formacion.gestformwww.controlador;

import com.ipartek.formacion.gestformwww.modelo.ModeloEntrega;
import com.ipartek.formacion.gestformwww.modelo.ModeloMaterial;
import com.ipartek.formacion.gestformwww.modelo.beans.Entrega;
import com.ipartek.formacion.gestformwww.modelo.beans.Material;
import com.ipartek.formacion.gestformwww.modelo.beans.excepciones.GestorFormacionExcepcion;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 *
 * @author Santi
 */
public class GuardarEntregaAccion implements Accion {

    private final String modificarEntregaJSP = "modificar-entrega";

    /**
     * Descripción: ejecuta la acción de borrado del modulo
     * @param servlet
     * @param request
     * @param response
     * @return devuelve el router que dirige a la página que corresponda (a Inicio o a Principal)
     */
    public AccionRouter ejecuta(HttpServlet servlet, HttpServletRequest request, HttpServletResponse response) {
        HttpSession sesion = request.getSession();
        AccionServlet as = (AccionServlet) servlet;
        AccionRouter router = null;
        ArrayList<String> mensajes = new ArrayList<String>();
        int entId = 0;
        Boolean correcto = false;
        int idCurso = 0;
        Entrega entrega = null;
        Entrega entregaBase = null;
        boolean ejecutar = Verificador.sinReenvio("aleatorioModificarEntrega", sesion, request);
        String operacion = "";
        boolean aniadir = false;
        boolean quitar = false;
        if (sesion.getAttribute("usuario") != null && request.getMethod().equalsIgnoreCase("POST")) {

            if (request.getParameter("entId") != null) {
                entId = Integer.parseInt(request.getParameter("entId"));
            } else if (request.getAttribute("entId") != null) {
                entId = Integer.parseInt(request.getAttribute("entId").toString());
            }

//            if (request.getParameter("idCurso") != null) {
//                idCurso = Integer.parseInt(request.getParameter("idCurso"));
//            } else if (request.getAttribute("idCurso") != null) {
//                idCurso = Integer.parseInt(request.getAttribute("idCurso").toString());
//            }
            if (request.getParameter("operacion") != null) {
                operacion = String.valueOf(request.getParameter("operacion"));
            } else if (request.getAttribute("operacion") != null) {
                operacion = String.valueOf(request.getAttribute("operacion").toString());
            }
            if (!operacion.equals("")) {
                if (operacion.equals("Añadir")) {
                    aniadir = true;
                }
                if (operacion.equals("Quitar")) {
                    quitar = true;
                }
            }
            ModeloMaterial modeloMaterial = (ModeloMaterial) servlet.getServletContext().getAttribute("ModeloMaterial");
            ModeloEntrega modeloEntrega = (ModeloEntrega) servlet.getServletContext().getAttribute("ModeloEntrega");
            try {
                if (entId != 0) {
                    entregaBase = modeloEntrega.getEntrega(entId);
                    idCurso=entregaBase.getCurId();
                    entrega = entregaBase;


                   
                        if (aniadir) {
                            //insertamos lineas nuevas porque puede que sean diferentes a la entrega base, y no se excluyan las unas a las otras
                            //modeloEntrega.eliminarEntrega(entId);
                            entrega = entregaBase;
                            if ((request.getParameter("cStock") != null) && (request.getParameter("cogerStock") != null)) {
                                int cantCogerStock = Integer.parseInt(request.getParameter("cogerStock"));
                                int matId = entrega.getLibId();
                                //recogemos el material
                                Material material = modeloMaterial.getMaterial(matId);
                                //restamos la cantidad indicada al campo libCantidadAlu
                                material.setLibCantidadAlu(material.getLibCantidadAlu() - cantCogerStock);
                                //actualizamos material
                                modeloMaterial.modificarMaterial(material);
                                //modificamos la cantidad de la entrega
                                entrega.setCantidad(cantCogerStock);
                                entrega.setObservaciones("Pedido Gestionado");
                                entrega.setPedir(false);
                                entrega.setEntId(0);
                                //insertamos la linea
                                modeloEntrega.insertarEntrega(entrega);


                            }
                            if ((request.getParameter("rPedido") != null) && (request.getParameter("realizarPedido") != null)) {
                                entrega = entregaBase;
                                int cantidadPedir = Integer.parseInt(request.getParameter("realizarPedido"));
                                entrega.setPedir(true);
                                entrega.setObservaciones("Pedido Pendiente");
                                entrega.setCantidad(cantidadPedir);
                                entrega.setEntId(0);
                                modeloEntrega.insertarEntrega(entrega);

                            }
                            if ((request.getParameter("sAnotar") != null) && (request.getParameter("soloAnotar") != null)) {
                                entrega = entregaBase;
                                int cantidadAnotar = Integer.parseInt(request.getParameter("soloAnotar"));
                                entrega.setPedir(false);
                                entrega.setObservaciones("Pedido no Gestionado");
                                entrega.setCantidad(cantidadAnotar);
                                entrega.setEntId(0);
                                modeloEntrega.insertarEntrega(entrega);
                            }

                        }
                        //si es quitar, no se insertaran lineas nuevas, solo se modificaran las existentes
                        if (quitar) {
                            if ((request.getParameter("dStock") != null) && (request.getParameter("devolverStock") != null)) {

                                entrega = entregaBase;
                                if(!entrega.getObservaciones().equals("Pedido no Gestionado")){
                                int cantDevolverStock = Integer.parseInt(request.getParameter("devolverStock"));
                                int matId = entrega.getLibId();
                                //recogemos el material
                                Material material = modeloMaterial.getMaterial(matId);
                                //restamos la cantidad indicada al campo libCantidadAlu
                                material.setLibCantidadAlu(material.getLibCantidadAlu() + cantDevolverStock);
                                modeloMaterial.modificarMaterial(material);
                                entrega.setCantidad(entrega.getCantidad() - cantDevolverStock);
                                modeloEntrega.modificarEntrega(entrega);
                                }
                            }
                            if ((request.getParameter("eStock") != null) && (request.getParameter("eliminarStock") != null)) {
                                entrega = entregaBase;
                                int cantEliminar = Integer.parseInt(request.getParameter("eliminarStock"));
                                entrega.setCantidad(entrega.getCantidad() - cantEliminar);
                                modeloEntrega.modificarEntrega(entrega);

                            }




                        }
          
                    correcto = true;
                }
            } catch (GestorFormacionExcepcion ex) {
                Logger.getLogger(GuardarEntregaAccion.class.getName()).log(Level.SEVERE, null, ex);
            }

            if (correcto) {

                comprobarListaEntregas(modeloEntrega,idCurso);

                mensajes.add("mensaje-guardar-entrega");
                request.setAttribute("entrega", entrega);
                request.setAttribute("contenido", modificarEntregaJSP);
                request.getSession().setAttribute("mensajes", mensajes);
                router = new AccionRouter("principal");
            } else {
                router = new AccionRouter("inicio");
            }

        } else {
            router = new AccionRouter("inicio");
        }
        return router;
    }
    //metodo que se encarga de borrar las entregas cuya cantidad sea cero
    //tambien se encarga de conbinar las entregas que sean iguales
    public void comprobarListaEntregas(ModeloEntrega modeloEntrega, int curId) {
        ArrayList<Entrega> listaEntregas = new ArrayList<Entrega>();
        ArrayList<Entrega> auxiliar = new ArrayList<Entrega>();
        try {
            listaEntregas = modeloEntrega.listaEntregas(curId);
            auxiliar = listaEntregas;
            for(int x=0;x<listaEntregas.size()-1;x++){
            
                Entrega entrega=listaEntregas.get(x);
                if(entrega.getCantidad()!=0){
                for(int y=0;y<auxiliar.size()-1;y++)
                {
                    Entrega ent=auxiliar.get(y);
                    if((entrega.getEntId()!=ent.getEntId())&&(ent.getLibId()==entrega.getLibId())&&(ent.isPedir()==entrega.isPedir())&&(ent.getObservaciones().equals(entrega.getObservaciones())))
                    {
                       entrega.setCantidad(entrega.getCantidad()+ ent.getCantidad());
                       modeloEntrega.modificarEntrega(entrega);
                       modeloEntrega.eliminarEntrega(ent.getEntId());
                       auxiliar.remove(x);
                    }
                }
                }else if(entrega.getCantidad()==0)
                {
                    modeloEntrega.eliminarEntrega(entrega.getEntId());
                    listaEntregas.remove(entrega);
                   
                    auxiliar.remove(x);
                    
                }
            }

        } catch (GestorFormacionExcepcion ex) {
            Logger.getLogger(GuardarEntregaAccion.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}
